﻿#include "attributepaneladapter.h"
#include <QSignalBlocker> // 显式包含 QSignalBlocker

/**
 * @brief AttributePanelAdapter::AttributePanelAdapter
 * @details 绑定属性面板控件并连接用户编辑信号。
 * @param cmbModel 型号下拉框。
 * @param cmbIfType 接口类型下拉框。
 * @param edtAddr 地址输入框。
 * @param parent Qt 父对象。
 */
AttributePanelAdapter::AttributePanelAdapter(QComboBox *cmbModel,
                                             QComboBox *cmbIfType,
                                             QLineEdit *edtAddr,
                                             QObject *parent)
    : QObject(parent)
    , cmbModel_(cmbModel)
    , cmbIfType_(cmbIfType)
    , edtAddr_(edtAddr)
{
    // 用户编辑 -> 发信号（Presenter接）
    connect(cmbModel_, &QComboBox::currentTextChanged, this, &AttributePanelAdapter::modelEdited);
    connect(cmbIfType_, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &AttributePanelAdapter::interfaceEdited);
    connect(edtAddr_, &QLineEdit::textChanged, this, &AttributePanelAdapter::addressEdited);
}

/**
 * @brief AttributePanelAdapter::setAvailableModels
 * @details 更新型号下拉框内容，并阻断信号避免回环。
 * @param models 型号列表。
 */
void AttributePanelAdapter::setAvailableModels(const QStringList &models)
{
    QSignalBlocker b(cmbModel_);
    cmbModel_->clear();
    cmbModel_->addItems(models);
}

/**
 * @brief AttributePanelAdapter::setInterfaceTypeNames
 * @details 更新接口类型下拉框内容。
 * @param names 接口名称列表。
 */
void AttributePanelAdapter::setInterfaceTypeNames(const QStringList &names)
{
    QSignalBlocker b(cmbIfType_);
    cmbIfType_->clear();
    cmbIfType_->addItems(names);
}

/**
 * @brief AttributePanelAdapter::setData
 * @details 同步模型、接口索引与地址到控件。
 * @param model 当前型号。
 * @param ifIndex 接口索引。
 * @param addr 接口地址。
 */
void AttributePanelAdapter::setData(const QString &model, int ifIndex, const QString &addr)
{
    cmbModel_->setCurrentText(model);
    if (ifIndex >= 0 && ifIndex < cmbIfType_->count())
        cmbIfType_->setCurrentIndex(ifIndex);
    edtAddr_->setText(addr);
}

/**
 * @brief AttributePanelAdapter::setEnabled
 * @details 控制属性面板的启用状态，型号编辑保持禁用以防手动修改。
 * @param en 是否启用接口与地址编辑。
 */
void AttributePanelAdapter::setEnabled(bool en)
{
    cmbModel_->setEnabled(false);

    cmbIfType_->setEnabled(en);
    edtAddr_->setEnabled(en);
}
